package br.com.comanda.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * Classe utilitaria com metodos estaticos para analise de colecoes
 * 
 * @author Thiago
 * @since 09/01/2013
 * @version 1.0
 */
public final class CollectionUtils {

	/**
	 * O construtor de classe utilitaria não pode ser instanciado
	 */
	private CollectionUtils() {
		super();
	}

	public static <T> T getFirst(List<T> collection) {
		return CollectionUtils.isEmpty(collection) ? null : collection.get(0);
	}

/**
	 * Passada uma colecao para esse metodo, retorna true se a colecao eh vazia
	 * ou false caso possua algum objeto.
	 * 
	 * @param {@link List<T> list
	 * @return boolean
	 */
	public static <T> boolean isEmpty(Collection<T> collection) {
		if (collection == null || (collection != null && collection.isEmpty())) {
			return true;
		}
		return false;
	}

	/**
	 * Passado como parametro uma collection de T e um T, verifica se o segundo
	 * parametro se encontra dentro do array.
	 * 
	 * @param String
	 *            [] array
	 * @param Integer
	 *            filtro
	 * @return boolean
	 */
	public static <T> boolean existsInCollection(Collection<T> collection,
			T filtro) {
		for (T i : collection) {
			if (i.equals(filtro)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Retorna a quantidade de itens em uma coleção.
	 * 
	 * @param <T>
	 * @param list
	 * @return
	 */
	public static <T> int size(Collection<T> list) {
		return list == null ? 0 : list.size();
	}

	/**
	 * Transforma um objeto do tipo Set para List
	 */
	public static <T> List<T> toList(Set<T> itens) {
		List<T> list = null;
		Iterator<T> iterator = itens.iterator();

		if (!CollectionUtils.isEmpty(itens)) {
			list = new ArrayList<T>();

			while (iterator.hasNext()) {
				list.add(iterator.next());
			}
		}

		return list;
	}
}
